package com.jiang.daily.Q2348;

/**
 * @author Jiang
 * @version 1.0
 * @date 2025/08/19 11:30
 */
class Solution {
    // public long zeroFilledSubarray(int[] nums) {
    //     long res = 0;
    //     int len = nums.length;
    //     int[] cnt = new int[len]; // 表示 [,i]连续0的个数（包含i）
    //     cnt[0] = nums[0] == 0 ? 1 : 0;
    //     res += cnt[0];
    //     for (int i = 1; i < len; i++) {
    //         if (nums[i] == 0) {
    //             if (nums[i - 1] == 0) {
    //                 cnt[i] = cnt[i - 1];
    //             }
    //             cnt[i]++;
    //             res += cnt[i];
    //         }
    //     }
    //     return res;
    // }

    // 增量法
    // public long zeroFilledSubarray(int[] nums) {
    //     long res = 0;
    //     int len = nums.length;
    //     nums[0] = nums[0] == 0 ? 1 : 0;
    //     res += nums[0];
    //     for (int i = 1; i < len; i++) {
    //         if (nums[i] != 0) {
    //             nums[i] = 0;
    //         } else {
    //             nums[i] = nums[i - 1] + 1;
    //             res += nums[i];
    //         }
    //     }
    //     return res;
    // }

    // 滑动窗口1
    // public long zeroFilledSubarray(int[] nums) {
    //     long res = 0;
    //     int len = nums.length;
    //     int l = -1;
    //     for(int r = 0; r < len; r++) {
    //         if (nums[r] == 0) {
    //             res += r - l;
    //         } else {
    //             l = r;
    //         }
    //     }
    //     return res;
    // }

    // 滑动窗口2 (长度定义为n要快一点)
    public long zeroFilledSubarray(int[] nums) {
        long res = 0;
        int n = nums.length;
        int l = 0;
        int r = 0;
        while (l < n) {
            if (nums[l] == 0) {
                r = l + 1;
                while (r < n && nums[r] == 0) {
                    r++;
                }
                long s = r - l;
                res += s * (s + 1) / 2;
                l = r + 1;
            } else {
                l++;
            }
        }
        return res;
    }
}
